/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package estsapp.controladores.ABMCostosFijos;

import estsapp.controladores.Controlador;
import estsapp.controladores.ControladorPrincipal;
import estsapp.controladores.FabricaControladores;
import estsapp.entidades.CostoFijo;
import estsapp.expertos.ExpertoABMCostosFijos;
import estsapp.expertos.FabricaExpertos;
import estsapp.expertos.excepciones.ABMCostoFijoException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Date;
import java.util.List;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;

/**
 *
 * @author Juan
 */
public class ControladorABMCostosFijos implements Controlador {

    PantallABMCostosFijos pantalla;
    ExpertoABMCostosFijos experto;
    PantallaABMCostoFijoJDialog pantallaCostosJDialog;
    private boolean iniciado = false;
    CostoFijo costoFijoSeleccionado;

    public ControladorABMCostosFijos() {
        pantalla = new PantallABMCostosFijos();
        experto = (ExpertoABMCostosFijos) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.ABM_COSTOS_FIJOS);
        pantallaCostosJDialog = new PantallaABMCostoFijoJDialog(null, true);
        cargarModelosYDatosTabla();

        cargarBotones();

        cargarBotonesJDialog();



    }

    @Override
    public JInternalFrame getPantalla() {
        return pantalla;
    }

    @Override
    public void iniciar() {
        if (!iniciado) {
            ((ControladorPrincipal) FabricaControladores.getInstance().getControlador(FabricaControladores.controladoresNombre.PRINCIPAL)).agregarPantallaInterna(pantalla);
            iniciado = true;
        }
        pantalla.setVisible(true);
        ((ModeloTablaCostosFijos) pantalla.getTablaCostosFijos().getModel()).setListaElementos(experto.buscarCostos());
        actualizarTotal();

    }

    private void cargarModelosYDatosTabla() {
        pantalla.getTablaCostosFijos().setModel(new ModeloTablaCostosFijos());
        pantalla.getTablaCostosFijos().addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent e) {
                seleccionarCosto();
            }
        });
    }

    public void seleccionarCosto() {
        int fila = pantalla.getTablaCostosFijos().getSelectedRow();
        if (fila == -1) {
            return;
        }
        int filaModelo = pantalla.getTablaCostosFijos().convertRowIndexToModel(fila);
        costoFijoSeleccionado = (CostoFijo) ((ModeloTablaCostosFijos) pantalla.getTablaCostosFijos().getModel()).getRow(filaModelo);

    }

    private void cargarBotones() {
        pantalla.getBtnNuevo().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                nuevoCosto();
            }
        });
        pantalla.getBtnEliminarFiltro().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                eliminarFiltro();
            }
        });
        pantalla.getBtnModificar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                modificarCosto();
            }
        });
        pantalla.getBtnSalir().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                salir();
            }
        });
        pantalla.getBotonFiltrarPorFechas().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                filtrarPorFechas();
            }
        });
    }

    private void eliminarFiltro() {
        ((ModeloTablaCostosFijos) pantalla.getTablaCostosFijos().getModel()).setListaElementos(experto.buscarCostos());
        actualizarTotal();
    }

    private void filtrarPorFechas() {
        ((ModeloTablaCostosFijos) pantalla.getTablaCostosFijos().getModel()).setListaElementos(experto.buscarCostosDeMesYAnio(pantalla.getMes().getMonth() + "", pantalla.getAnio().getYear() + ""));
        actualizarTotal();
    }

    private void actualizarTotal() {
        List<CostoFijo> lista = ((ModeloTablaCostosFijos) pantalla.getTablaCostosFijos().getModel()).getListaElementos();
        Float total = 0f;
        for (CostoFijo costoFijo : lista) {
            total = costoFijo.getMonto() + total;
        }

        pantalla.getTextoTotalCostoFijo().setText(String.valueOf(total));
    }

    private void salir() {
        pantallaCostosJDialog.getTextoDescripcion().setText("");
        pantallaCostosJDialog.getTextoMonto().setText("");
        Date fechaActual = new Date();
        pantallaCostosJDialog.getAnio().setYear(fechaActual.getYear() + 1900);
        pantallaCostosJDialog.getMes().setMonth(fechaActual.getMonth());
        pantalla.setVisible(false);
    }

    private void nuevoCosto() {
        costoFijoSeleccionado = null;
        pantallaCostosJDialog.setVisible(true);
        pantallaCostosJDialog.getTextoDescripcion().setText("");
        pantallaCostosJDialog.getTextoMonto().setText("");
        Date fechaActual = new Date();
        pantallaCostosJDialog.getAnio().setYear(fechaActual.getYear() + 1900);
        pantallaCostosJDialog.getMes().setMonth(fechaActual.getMonth());

    }

    private void modificarCosto() {
        if (costoFijoSeleccionado != null) {
            pantallaCostosJDialog.getTextoDescripcion().setText(costoFijoSeleccionado.getDescripcion());
            pantallaCostosJDialog.getTextoMonto().setText(String.valueOf(costoFijoSeleccionado.getMonto()));
            pantallaCostosJDialog.getMes().setMonth(Integer.valueOf(costoFijoSeleccionado.getMes()));
            pantallaCostosJDialog.getAnio().setYear(Integer.valueOf(costoFijoSeleccionado.getAnio()));
            pantallaCostosJDialog.setVisible(true);

        } else {
            JOptionPane.showMessageDialog(null, "Seleccione costo fijo a modificar");
        }

    }

    private void cargarBotonesJDialog() {
        pantallaCostosJDialog.getBtnGuardarJDialog().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                guardar();
            }
        });
        pantallaCostosJDialog.getBtnSalirJDialog().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                pantallaCostosJDialog.setVisible(false);
            }
        });
    }

    public void guardar() {
        if (costoFijoSeleccionado == null) {
            costoFijoSeleccionado = new CostoFijo();
        }

        costoFijoSeleccionado.setDescripcion(pantallaCostosJDialog.getTextoDescripcion().getText());
        costoFijoSeleccionado.setMonto(Float.parseFloat(pantallaCostosJDialog.getTextoMonto().getText()));
        costoFijoSeleccionado.setMes(pantallaCostosJDialog.getMes() + "");
        costoFijoSeleccionado.setAnio(pantallaCostosJDialog.getAnio() + "");
        try {
            experto.guardar(costoFijoSeleccionado);
        } catch (ABMCostoFijoException ex) {
            ex.printStackTrace();
        }
        pantallaCostosJDialog.setVisible(false);
        ((ModeloTablaCostosFijos) pantalla.getTablaCostosFijos().getModel()).setListaElementos(experto.buscarCostos());
        actualizarTotal();

    }
}
